package pe.gob.mininter.dirandro.vaadin.panel.caso;

import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import pe.gob.mininter.dirandro.model.Caso;
import pe.gob.mininter.dirandro.model.DetCasoPersona;
import pe.gob.mininter.dirandro.model.Organizacion;
import pe.gob.mininter.dirandro.model.Persona;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.CasoPersonaService;
import pe.gob.mininter.dirandro.service.OrganizacionService;
import pe.gob.mininter.dirandro.service.PersonaService;
import pe.gob.mininter.dirandro.util.BeanValidar;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.dialogs.AlertDialog;
import pe.gob.mininter.dirandro.vaadin.panel.util.PanelAgregarPersona;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.Injector;
import pe.gob.mininter.dirandro.vaadin.util.listener.PanelAgregarPersonaListener;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

public class PanelRegistroCasoInterviniente extends CustomComponent implements ClickListener, PanelAgregarPersonaListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout verticalLayout_3;
	@AutoGenerated
	private Table tblIntervinientes;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_34;
	@AutoGenerated
	private Button btnRIAgregar;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_2;
	@AutoGenerated
	private TextArea txtObservacion;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_32;
	@AutoGenerated
	private ComboBoxLOVS cmbInterSituacion;
	@AutoGenerated
	private ComboBox cmbInterOrganizacion;
	@AutoGenerated
	private HorizontalLayout lytDatos;
	@AutoGenerated
	private Label lblDatosInterviniente;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_3;
	@AutoGenerated
	private ComboBox cmbTipoParticipante;
	@AutoGenerated
	private Button btnRIBuscar;
	@AutoGenerated
	private ComboBox cmbIntervinientes;
	/**
	 * 
	 */
	private static final long serialVersionUID = 9014403713797774518L;
	private static final Logger logger = Logger.getLogger(PanelRegistroCasoInterviniente.class);
	private Caso caso;
	private DetCasoPersona casoPersona;
	
	private PersonaService personaService;
	private CasoPersonaService casoPersonaService;
	private OrganizacionService organizacionService;
	
	private List<Persona> lstPersonas;
	private boolean inicializado=false;
	private IndexedContainer container;

	private static final String COLUMN_ID = "COLUMN_ID";
	private static final String COLUMN_INTERVINIENTE = "COLUMN_INTERVINIENTE";
	private static final String COLUMN_INTERVINIENTE_ID = "COLUMN_INTERVINIENTE_ID";
	private static final String COLUMN_ORGANIZACION = "COLUMN_ORGANIZACION";
	private static final String COLUMN_ORGANIZACION_ID = "COLUMN_ORGANIZACION_ID";
	private static final String COLUMN_SITUACION = "COLUMN_SITUACION";
	private static final String COLUMN_SITUACION_ID = "COLUMN_SITUACION_ID";
	private static final String COLUMN_OBSERVACION = "COLUMN_OBSERVACION";
		
	public Caso getCaso() {
		return caso;
	}

	public void setCaso(Caso caso) {
		this.caso = caso;
		postConstruct();
	}

	
	public PanelRegistroCasoInterviniente() {
		buildMainLayout();

		personaService = Injector.obtenerServicio(PersonaService.class);
		//empresaService = Injector.obtenerServicio(EmpresaService.class);
		organizacionService = Injector.obtenerServicio(OrganizacionService.class);
		casoPersonaService = Injector.obtenerServicio(CasoPersonaService.class);

		setCompositionRoot(mainLayout);
		postConstruct();
	}

	@Override
	public void attach() {
		super.attach();
	}

	public void postConstruct() {
		if(caso!=null && !caso.esNuevo() && !inicializado){
			
			cmbInterSituacion.setCodigoLista(Constante.LISTA.CODIGO.SIT_PROCESADO);
			cmbInterSituacion.setInputPrompt("Situación");
			cmbInterSituacion.attach();
	
			cargarCmbInterOrganizacion();
	
			btnRIBuscar.setIcon(Constante.ICONOS.CREATE);
			btnRIBuscar.addListener((ClickListener) this);
			btnRIAgregar.addListener((ClickListener) this);
		
			cmbIntervinientes.setInputPrompt("Incautado a:");
			cmbIntervinientes.setItemCaptionPropertyId("nombreCompleto");
			cmbIntervinientes.setImmediate(true);
			cargaComboPersonaIncautada();
	
			cmbIntervinientes.addListener(new ValueChangeListener() {
				private static final long serialVersionUID = 2720977948538256976L;
	
				@Override
				public void valueChange(ValueChangeEvent event) {
					cmbIntervinientesValueChange(event);
				}
	
			});

			tblIntervinientes.setSelectable(true);
			tblIntervinientes.setImmediate(true);
			tblIntervinientes.setNullSelectionAllowed(true);
			tblIntervinientes.setNullSelectionItemId(null);
			tblIntervinientes.addListener(new ValueChangeListener() {
				
				private static final long serialVersionUID = 4944319484424744679L;

				@Override
				public void valueChange(ValueChangeEvent event) {
					boolean esModoNuevo = tblIntervinientes.getValue() == null;
					limpiarTodo();
					if(esModoNuevo){
						tblIntervinientes.setValue(null);
						habilitarEdicion(false);
					}else{
						habilitarEdicion(true);
						Item item = tblIntervinientes.getItem(tblIntervinientes.getValue());
					
						casoPersona.setId((Long) item.getItemProperty(COLUMN_ID).getValue());
						
						txtObservacion.setValue((String)item.getItemProperty(COLUMN_OBSERVACION).getValue());
						cmbInterOrganizacion.select(new Organizacion((Long)item.getItemProperty(COLUMN_ORGANIZACION_ID).getValue()));
						cmbInterSituacion.select(new Valor((Long)item.getItemProperty(COLUMN_SITUACION_ID).getValue()));
						cmbIntervinientes.select(((Persona)item.getItemProperty(COLUMN_INTERVINIENTE_ID).getValue()));
						
					}
				}
			});
	
			containerTabla();
			cargarIntervinientes();
			inicializado=true;
			lblDatosInterviniente.setValue(StringUtils.EMPTY);
			limpiarTodo();
			habilitarEdicion(false);
		}
	}

	private void cargarCmbInterOrganizacion() {
		List<Organizacion> organizaciones = organizacionService.buscar(null);
		BeanItemContainer<Organizacion> containerOrganizacion = new BeanItemContainer<Organizacion>(
		Organizacion.class, organizaciones);
		cmbInterOrganizacion.setContainerDataSource(containerOrganizacion);
		cmbInterOrganizacion.setInputPrompt("Organizacion Delictiva");
		cmbInterOrganizacion.setItemCaptionPropertyId("nombre");

	}

	private void containerTabla() {
		this.container = new IndexedContainer();
		container. addContainerProperty(COLUMN_ID, Long.class, null);
		container. addContainerProperty(COLUMN_INTERVINIENTE, String.class, null);
		container.addContainerProperty(COLUMN_ORGANIZACION, String.class, null);
		container.addContainerProperty(COLUMN_ORGANIZACION_ID, Long.class, null);
		container.addContainerProperty(COLUMN_SITUACION, String.class, null);
		container.addContainerProperty(COLUMN_SITUACION_ID, Long.class, null);
		container.addContainerProperty(COLUMN_OBSERVACION, String.class, null);
		container.addContainerProperty(COLUMN_INTERVINIENTE_ID, Persona.class, null);

		tblIntervinientes.setContainerDataSource(container);

		tblIntervinientes.setColumnHeader(COLUMN_INTERVINIENTE, "Interviniente");
		tblIntervinientes.setColumnHeader(COLUMN_ORGANIZACION, "Organización");
		tblIntervinientes.setColumnHeader(COLUMN_SITUACION, "Situación");

		tblIntervinientes.setVisibleColumns(new Object[] { COLUMN_INTERVINIENTE, COLUMN_ORGANIZACION, COLUMN_SITUACION });

		tblIntervinientes.setColumnWidth(COLUMN_INTERVINIENTE, 200);
		tblIntervinientes.setColumnWidth(COLUMN_ORGANIZACION, 150);
		tblIntervinientes.setColumnWidth(COLUMN_SITUACION, 100);
	}

	public void cargarIntervinientes() {
		logger.debug("cargarIntervinientes()");
		DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

		container.removeAllItems();
		
		DetCasoPersona dt = new DetCasoPersona();
		dt.setCaso(caso);
		List<DetCasoPersona> intervinientes = casoPersonaService.buscar(dt);
		
		for (final DetCasoPersona interviniente : intervinientes) {
			if(interviniente.getPersona()==null){
				continue;
			}
			logger.debug("interviniente "+interviniente.getId());
			Item item = container.addItem(interviniente.getId());
			
			item.getItemProperty(COLUMN_ID).setValue( interviniente.getId());
			item.getItemProperty(COLUMN_INTERVINIENTE).setValue( interviniente.getPersona().getNombreCompleto());
			item.getItemProperty(COLUMN_ORGANIZACION).setValue(interviniente.getOrganizacion() != null ? interviniente.getOrganizacion().getNombre() : StringUtils.EMPTY);
			item.getItemProperty(COLUMN_ORGANIZACION_ID).setValue(interviniente.getOrganizacion()!=null?interviniente.getOrganizacion().getId():null);
			item.getItemProperty(COLUMN_SITUACION).setValue(interviniente.getSituacion() != null ? interviniente.getSituacion().getNombre() : StringUtils.EMPTY);
			item.getItemProperty(COLUMN_SITUACION_ID).setValue(HarecUtil.valorIdToEmpty(interviniente.getSituacion()));
			item.getItemProperty(COLUMN_OBSERVACION).setValue(interviniente.getObservacion());
			item.getItemProperty(COLUMN_INTERVINIENTE_ID).setValue(interviniente.getPersona());
			logger.debug( interviniente.getPersona().getNombreCompleto() );
		}
	}

	private void cmbIntervinientesValueChange(ValueChangeEvent event) {
		limpiarPersonaEmpresa();
		if (event.getProperty().getValue() != null) {
				imprimirPersona((Persona) event.getProperty().getValue());
		}
	}

	private void cargarWindowPersona() {

		PanelAgregarPersona pnlAgregarPersona = new PanelAgregarPersona();
		pnlAgregarPersona
				.setPanelAgregarPersonaReponder((PanelAgregarPersonaListener) this);

		final Window window = new Window() {

			private static final long serialVersionUID = 1L;

			protected void close() {
				getApplication().getMainWindow().removeWindow(getWindow());
			}
		};

		window.setCaption("Registrar Persona");
		window.addComponent(pnlAgregarPersona);
		window.setModal(true);
		window.setResizable(false);
		window.setWidth("650px");
		window.setHeight("-1.0");
		getApplication().getMainWindow().addWindow(window);

	}

	private void habilitarEdicion(boolean flag){
		if(flag){
			btnRIAgregar.setCaption("Actualizar");
		}else{
			btnRIAgregar.setCaption("Agregar");
		}
	}

	private void limpiarPersonaEmpresa() {
		lytDatos.setVisible(false);
		lblDatosInterviniente.setVisible(false);
		lblDatosInterviniente.setValue("");
	}

	private void cargaComboPersonaIncautada() {
		
		if (lstPersonas == null)
			lstPersonas = personaService.buscar(null);
		cmbIntervinientes.setItemCaptionPropertyId("nombreCompleto");
		cmbIntervinientes.setContainerDataSource(new BeanItemContainer<Persona>(Persona.class, lstPersonas));
		
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if (event.getButton().equals(btnRIBuscar)) {

				cargarWindowPersona();
		
		} else if (event.getButton().equals(btnRIAgregar)) {
			buttonClickBtnRIAgregar();
		}

	}

	private void buttonClickBtnRIAgregar() {
		
		casoPersona.setObservacion((String) txtObservacion.getValue());
		casoPersona.setOrganizacion((Organizacion) cmbInterOrganizacion.getValue());
		casoPersona.setSituacion(cmbInterSituacion.getValor());
		casoPersona.setPersona((Persona)cmbIntervinientes.getValue());
        HarecUtil.validar(getWindow(), casoPersona, new BeanValidar[]{
        				new BeanValidar("situacion", new Object[]{"Situacion"}, cmbInterSituacion)});
		
        if(casoPersona.esNuevo()){
        	casoPersonaService.crear(casoPersona);	
        }else{
        	casoPersonaService.actualizar(casoPersona);
        }
		AlertDialog alertDialog = new  AlertDialog("Registro de Persona", "Se ha registrado a la persona correctamente", "Aceptar", "400");
		getApplication().getMainWindow().addWindow(alertDialog);
		
		cargarIntervinientes();
		limpiarTodo();

	}

	private void limpiarTodo() {
		
		casoPersona = new DetCasoPersona();
		casoPersona.setCaso(caso);
		
		lstPersonas = personaService.buscar(null);
		cargaComboPersonaIncautada();
		
		cmbInterOrganizacion.select(null);
		cmbInterSituacion.select(null);
		txtObservacion.setValue(StringUtils.EMPTY);
	}

	@Override
	public void setPersonaPopUp(Persona persona) {

		lstPersonas = personaService.buscar(null);
		
		cargaComboPersonaIncautada();

		cmbIntervinientes.select(persona);
		imprimirPersona(persona);
	}

	private void imprimirPersona(Persona persona) {
		String plantilla = "<p><b>Tipo y Número de Documento:</b> {0} {1} <b>Nombres Completos:</b> {2} <b>Nacionalidad:</b> {3} <b>Sexo:</b> {4}</p>";

		lytDatos.setVisible(true);
		String html = MessageFormat.format(plantilla, 
				HarecUtil.valorNombreToEmpty(persona.getTipoDocumento()),
				persona.getNroDocumento(),
				persona.getNombreCompleto(),
				HarecUtil.paisNombreToEmpty(persona.getNacionalidad()),
				persona.getSexo());

		lytDatos.setVisible(true);
		lblDatosInterviniente.setVisible(true);
		lblDatosInterviniente.setValue(html);

	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// verticalLayout_3
		verticalLayout_3 = buildVerticalLayout_3();
		mainLayout.addComponent(verticalLayout_3);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildVerticalLayout_3() {
		// common part: create layout
		verticalLayout_3 = new VerticalLayout();
		verticalLayout_3.setImmediate(false);
		verticalLayout_3.setWidth("-1px");
		verticalLayout_3.setHeight("-1px");
		verticalLayout_3.setMargin(true);
		verticalLayout_3.setSpacing(true);
		
		// horizontalLayout_3
		horizontalLayout_3 = buildHorizontalLayout_3();
		verticalLayout_3.addComponent(horizontalLayout_3);
		
		// lytDatos
		lytDatos = buildLytDatos();
		verticalLayout_3.addComponent(lytDatos);
		
		// horizontalLayout_32
		horizontalLayout_32 = buildHorizontalLayout_32();
		verticalLayout_3.addComponent(horizontalLayout_32);
		
		// horizontalLayout_2
		horizontalLayout_2 = buildHorizontalLayout_2();
		verticalLayout_3.addComponent(horizontalLayout_2);
		
		// horizontalLayout_34
		horizontalLayout_34 = buildHorizontalLayout_34();
		verticalLayout_3.addComponent(horizontalLayout_34);
		
		// tblIntervinientes
		tblIntervinientes = new Table();
		tblIntervinientes.setImmediate(false);
		tblIntervinientes.setWidth("900px");
		tblIntervinientes.setHeight("350px");
		verticalLayout_3.addComponent(tblIntervinientes);
		
		return verticalLayout_3;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_3() {
		// common part: create layout
		horizontalLayout_3 = new HorizontalLayout();
		horizontalLayout_3.setImmediate(false);
		horizontalLayout_3.setWidth("-1px");
		horizontalLayout_3.setHeight("-1px");
		horizontalLayout_3.setMargin(false);
		horizontalLayout_3.setSpacing(true);
		
		// cmbIntervinientes
		cmbIntervinientes = new ComboBox();
		cmbIntervinientes.setCaption("Interviniente");
		cmbIntervinientes.setImmediate(false);
		cmbIntervinientes.setWidth("350px");
		cmbIntervinientes.setHeight("-1px");
		horizontalLayout_3.addComponent(cmbIntervinientes);
		
		// btnRIBuscar
		btnRIBuscar = new Button();
		btnRIBuscar.setCaption(" ");
		btnRIBuscar.setImmediate(true);
		btnRIBuscar.setWidth("-1px");
		btnRIBuscar.setHeight("-1px");
		horizontalLayout_3.addComponent(btnRIBuscar);
		horizontalLayout_3.setComponentAlignment(btnRIBuscar, new Alignment(9));
		
		// cmbTipoParticipante
		cmbTipoParticipante = new ComboBox();
		cmbTipoParticipante.setCaption("Tipo de Participante");
		cmbTipoParticipante.setImmediate(false);
		cmbTipoParticipante.setWidth("-1px");
		cmbTipoParticipante.setHeight("-1px");
		horizontalLayout_3.addComponent(cmbTipoParticipante);
		
		return horizontalLayout_3;
	}

	@AutoGenerated
	private HorizontalLayout buildLytDatos() {
		// common part: create layout
		lytDatos = new HorizontalLayout();
		lytDatos.setImmediate(false);
		lytDatos.setWidth("-1px");
		lytDatos.setHeight("-1px");
		lytDatos.setMargin(false);
		lytDatos.setSpacing(true);
		
		// lblDatosInterviniente
		lblDatosInterviniente = new Label();
		lblDatosInterviniente.setImmediate(false);
		lblDatosInterviniente.setWidth("100.0%");
		lblDatosInterviniente.setHeight("100.0%");
		lblDatosInterviniente.setValue("Label");
		lblDatosInterviniente.setContentMode(3);
		lytDatos.addComponent(lblDatosInterviniente);
		
		return lytDatos;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_32() {
		// common part: create layout
		horizontalLayout_32 = new HorizontalLayout();
		horizontalLayout_32.setImmediate(false);
		horizontalLayout_32.setWidth("-1px");
		horizontalLayout_32.setHeight("-1px");
		horizontalLayout_32.setMargin(false);
		horizontalLayout_32.setSpacing(true);
		
		// cmbInterOrganizacion
		cmbInterOrganizacion = new ComboBox();
		cmbInterOrganizacion.setCaption("Organización");
		cmbInterOrganizacion.setImmediate(false);
		cmbInterOrganizacion.setWidth("-1px");
		cmbInterOrganizacion.setHeight("-1px");
		horizontalLayout_32.addComponent(cmbInterOrganizacion);
		
		// cmbInterSituacion
		cmbInterSituacion = new ComboBoxLOVS();
		cmbInterSituacion.setCaption("Situación");
		cmbInterSituacion.setImmediate(false);
		cmbInterSituacion.setWidth("-1px");
		cmbInterSituacion.setHeight("-1px");
		horizontalLayout_32.addComponent(cmbInterSituacion);
		
		return horizontalLayout_32;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_2() {
		// common part: create layout
		horizontalLayout_2 = new HorizontalLayout();
		horizontalLayout_2.setImmediate(false);
		horizontalLayout_2.setWidth("-1px");
		horizontalLayout_2.setHeight("-1px");
		horizontalLayout_2.setMargin(false);
		
		// txtObservacion
		txtObservacion = new TextArea();
		txtObservacion.setCaption("Observaciones");
		txtObservacion.setImmediate(false);
		txtObservacion.setWidth("900px");
		txtObservacion.setHeight("60px");
		horizontalLayout_2.addComponent(txtObservacion);
		
		return horizontalLayout_2;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_34() {
		// common part: create layout
		horizontalLayout_34 = new HorizontalLayout();
		horizontalLayout_34.setImmediate(false);
		horizontalLayout_34.setWidth("900px");
		horizontalLayout_34.setHeight("-1px");
		horizontalLayout_34.setMargin(false);
		horizontalLayout_34.setSpacing(true);
		
		// btnRIAgregar
		btnRIAgregar = new Button();
		btnRIAgregar.setCaption("Agregar");
		btnRIAgregar.setImmediate(true);
		btnRIAgregar.setWidth("-1px");
		btnRIAgregar.setHeight("-1px");
		horizontalLayout_34.addComponent(btnRIAgregar);
		horizontalLayout_34.setComponentAlignment(btnRIAgregar, new Alignment(
				24));
		
		return horizontalLayout_34;
	}

}
